const { Category, Note, NoteCategory } = require('../models');
const { Sequelize } = require('sequelize');
const { generateUniqueId } = require('../utils/authUtils');
const { validationResult } = require('express-validator');

// 创建分类（仅管理员）
const createCategory = async (req, res) => {
  try {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }

    const { name, description } = req.body;

    // 检查分类名是否已存在
    const existingCategory = await Category.findOne({ where: { name } });
    if (existingCategory) {
      return res.status(400).json({ message: '分类名已存在' });
    }

    // 创建分类
    const category = await Category.create({
      id: generateUniqueId(),
      name,
      description,
      created_at: new Date()
    });

    res.status(201).json({ message: '分类创建成功', category });
  } catch (error) {
    console.error('创建分类失败:', error);
    res.status(500).json({ message: '服务器错误' });
  }
};

// 获取所有分类
const getCategories = async (req, res) => {
  try {
    // 查找所有分类，并计算每个分类下的笔记数量
    const categories = await Category.findAll({
      attributes: [
        'id', 'name', 'description', 'created_at',
        [
          Sequelize.fn('COUNT', Sequelize.col('NoteCategories.note_id')),
          'noteCount'
        ]
      ],
      include: [
        {
          model: NoteCategory,
          attributes: []
        }
      ],
      group: ['Category.id'],
      order: [['created_at', 'DESC']]
    });

    res.status(200).json({
      categories,
      total: categories.length
    });
  } catch (error) {
    console.error('获取分类列表失败:', error);
    res.status(500).json({ message: '服务器错误' });
  }
};

// 获取单个分类详情
const getCategoryById = async (req, res) => {
  try {
    const { id } = req.params;
    
    const category = await Category.findByPk(id, {
      include: [
        {
          model: Note,
          through: NoteCategory,
          attributes: ['id', 'title', 'created_at']
        }
      ]
    });
    
    if (!category) {
      return res.status(404).json({ message: '分类不存在' });
    }

    const formattedCategory = {
      id: category.id,
      name: category.name,
      description: category.description,
      created_at: category.created_at,
      noteCount: category.Notes.length,
      notes: category.Notes.map(note => ({
        id: note.id,
        title: note.title,
        created_at: note.created_at
      }))
    };

    res.status(200).json(formattedCategory);
  } catch (error) {
    console.error('获取分类详情失败:', error);
    res.status(500).json({ message: '服务器错误' });
  }
};

// 更新分类（仅管理员）
const updateCategory = async (req, res) => {
  try {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }

    const { id } = req.params;
    const { name, description } = req.body;

    // 查找分类
    const category = await Category.findByPk(id);
    if (!category) {
      return res.status(404).json({ message: '分类不存在' });
    }

    // 如果更新名称，检查是否重复
    if (name && name !== category.name) {
      const existingCategory = await Category.findOne({ where: { name } });
      if (existingCategory) {
        return res.status(400).json({ message: '分类名已存在' });
      }
    }

    // 更新分类信息
    await category.update({ name, description });

    res.status(200).json({ message: '分类更新成功', category });
  } catch (error) {
    console.error('更新分类失败:', error);
    res.status(500).json({ message: '服务器错误' });
  }
};

// 删除分类（仅管理员）
const deleteCategory = async (req, res) => {
  try {
    const { id } = req.params;

    // 查找分类
    const category = await Category.findByPk(id);
    if (!category) {
      return res.status(404).json({ message: '分类不存在' });
    }

    // 检查分类下是否有笔记
    const noteCount = await NoteCategory.count({ where: { category_id: id } });
    if (noteCount > 0) {
      return res.status(400).json({ message: '分类下还有笔记，无法删除' });
    }

    // 删除分类
    await category.destroy();

    res.status(200).json({ message: '分类删除成功' });
  } catch (error) {
    console.error('删除分类失败:', error);
    res.status(500).json({ message: '服务器错误' });
  }
};

module.exports = {
  createCategory,
  getCategories,
  getCategoryById,
  updateCategory,
  deleteCategory
};